#pragma once

#include <stdint.h>

namespace data_basic {

    // 多项式: x^8 + x^5 + x^4 + 1 (0x31)
    constexpr uint8_t CRC8_POLY_MAXIM = 0x31;

    /**
     * @brief 增量式 CRC8 计算函数
     * * @param crc  上一次计算的 CRC 值 (如果是第一个字节，则传入初始值，如 0x00 或 0xFF)
     * @param data 当前要参与计算的新字节
     * @return uint8_t 新的 CRC 值
     */
    uint8_t incremental_crc8(uint8_t crc, uint8_t data) {
        crc ^= data;  // 把新数据异或到 CRC 寄存器

        for (int i = 0; i < 8; i++) {
            // 如果最高位是 1，则左移并异或多项式
            if (crc & 0x80) {
                crc = (crc << 1) ^ CRC8_POLY_MAXIM;
            }
            else {
                crc <<= 1;
            }
        }
        return crc;
    }

}  // namespace data_basic
